package cn.edu.sgu.www.mhxysy.service.achievement.impl;

import cn.edu.sgu.www.mhxysy.pager.Pager;
import cn.edu.sgu.www.mhxysy.consts.CustomMessages;
import cn.edu.sgu.www.mhxysy.dto.achievement.RoleChengweiDTO;
import cn.edu.sgu.www.mhxysy.entity.achievement.RoleChengwei;
import cn.edu.sgu.www.mhxysy.enums.OpenStatus;
import cn.edu.sgu.www.mhxysy.mapper.achievement.RoleChengweiMapper;
import cn.edu.sgu.www.mhxysy.pager.achievement.RoleChengweiPager;
import cn.edu.sgu.www.mhxysy.service.achievement.RoleChengweiService;
import cn.edu.sgu.www.mhxysy.util.ObjectUtils;
import cn.edu.sgu.www.mhxysy.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 沐雨橙风ιε
 * @version 1.0
 */
@Service
public class RoleChengweiServiceImpl implements RoleChengweiService {

	private final RoleChengweiMapper roleChengweiMapper;

	@Autowired
	public RoleChengweiServiceImpl(RoleChengweiMapper roleChengweiMapper) {
		this.roleChengweiMapper = roleChengweiMapper;
	}

	@Override
	public void change(String roleId, Integer chengweiId) {
		/*
		 * 1、批量修改角色称谓使用状态
		 */
		// 通过角色ID修改角色称谓使用状态为：0-未使用
		UpdateWrapper<RoleChengwei> updateWrapper = new UpdateWrapper<>();

		updateWrapper.set("use_status", 0);
		updateWrapper.eq("role_id", roleId);

		roleChengweiMapper.update(updateWrapper.getEntity(), updateWrapper);

		/*
		 * 2、添加/修改角色称谓
		 */
		// 查询角色称谓
		QueryWrapper<RoleChengwei> queryWrapper = new QueryWrapper<>();

		queryWrapper.eq("role_id", roleId);
		queryWrapper.eq("chengwei_id", chengweiId);

		// 通过角色ID和称谓ID查询角色称谓
		Long count = roleChengweiMapper.selectCount(queryWrapper);

		// 判断查询结果是否为空
		if (count == 0) { // 1、为空，添加
			RoleChengwei chengwei = new RoleChengwei();

			chengwei.setId(chengwei.uuid());
			chengwei.setRoleId(roleId);
			chengwei.setChengweiId(chengweiId);
			chengwei.setUseStatus(OpenStatus.OPEN.getValue());

			roleChengweiMapper.insert(chengwei);
		} else { // 2、不为空，修改
			updateWrapper.clear();

			updateWrapper.eq("role_id", roleId);
			updateWrapper.eq("chengwei_id", chengweiId);

			updateWrapper.set("chengwei_id", chengweiId);
			updateWrapper.set("use_status", OpenStatus.OPEN.getValue());

			roleChengweiMapper.update(updateWrapper.getEntity(), updateWrapper);
		}
	}

	@Override
	public void insert(RoleChengweiDTO roleChengweiDTO) {
		// 如果状态为1，则表示开启，先关闭角色所有称谓
		if (roleChengweiDTO.getUseStatus() == 1) {
			UpdateWrapper<RoleChengwei> updateWrapper = new UpdateWrapper<>();

			updateWrapper.eq("id", roleChengweiDTO.getChengweiId());
			updateWrapper.set("use_status", 0);

			roleChengweiMapper.update(updateWrapper.getEntity(), updateWrapper);
		}

		RoleChengwei roleChengwei = toEntity(roleChengweiDTO);

		roleChengwei.setId(roleChengwei.uuid());

		roleChengweiMapper.insert(roleChengwei);
	}

	@Override
	public void deleteByIds(List<String> ids) {
		roleChengweiMapper.deleteBatchIds(ids);
	}

	@Override
	public void updateById(RoleChengweiDTO roleChengweiDTO) {
		ObjectUtils.requireNonNull(roleChengweiDTO.getId(), CustomMessages.ID_NOT_NULL);

		// 如果状态为1，则表示开启，先关闭角色所有称谓
		if (roleChengweiDTO.getUseStatus() == 1) {
			UpdateWrapper<RoleChengwei> updateWrapper = new UpdateWrapper<>();

			updateWrapper.eq("id", roleChengweiDTO.getChengweiId());
			updateWrapper.set("use_status", 0);

			roleChengweiMapper.update(updateWrapper.getEntity(), updateWrapper);
		}

		RoleChengwei roleChengwei = toEntity(roleChengweiDTO);

		roleChengweiMapper.updateById(roleChengwei);
	}

	@Override
	public Page<RoleChengwei> selectByPage(RoleChengweiPager pager) {
		QueryWrapper<RoleChengwei> queryWrapper = new QueryWrapper<>();
		Page<RoleChengwei> page = Pager.ofPage(pager);

		queryWrapper.eq(
				StringUtils.isNotEmpty(pager.getRoleId()),
				"role_id", pager.getRoleId()
		);
		queryWrapper.eq(
				pager.getChengweiId() != null,
				"chengwei_id", pager.getChengweiId()
		);

		return roleChengweiMapper.selectPage(page, queryWrapper);
	}

	@Override
	public RoleChengwei select(String roleId, Integer useStatus, Integer chengweiId) {
		QueryWrapper<RoleChengwei> queryWrapper = new QueryWrapper<>();

		queryWrapper.eq(chengweiId != null, "chengwei_id", chengweiId);
		queryWrapper.eq(useStatus != null, "use_status", useStatus);
		queryWrapper.eq(StringUtils.isNotEmpty(roleId), "role_id", roleId);

		return roleChengweiMapper.selectOne(queryWrapper);
	}

	private RoleChengwei toEntity(RoleChengweiDTO roleChengweiDTO) {
		RoleChengwei roleChengwei = new RoleChengwei();

		roleChengwei.setId(roleChengweiDTO.getId());
		roleChengwei.setRoleId(roleChengweiDTO.getRoleId());
		roleChengwei.setEndTime(roleChengweiDTO.getEndTime());
		roleChengwei.setUseStatus(roleChengweiDTO.getUseStatus());
		roleChengwei.setChengweiId(roleChengweiDTO.getChengweiId());

		return roleChengwei;
	}

}